@namespace Oqtane.Modules.Admin.Register
@inherits ModuleBase
@inject NavigationManager NavigationManager
@inject IUserService UserService
@inject IStringLocalizer<Index> Localizer
@inject IStringLocalizer<SharedResources> SharedLocalizer
@inject ISettingService SettingService

@if (PageState.Site.AllowRegistration)
{
    <AuthorizeView Roles="@RoleNames.Registered">
        <Authorizing>
            <text>...</text>
        </Authorizing>
        <Authorized>
            <ModuleMessage Message="@Localizer["Info.Registration.Exists"]" Type="MessageType.Info" />
        </Authorized>
        <NotAuthorized>
            <ModuleMessage Message="@_passwordrequirements" Type="MessageType.Info" />
            <form @ref="form" class="@(validated ? "was-validated" : "needs-validation")" novalidate>
                <div class="container">
                    <div class="row mb-1 align-items-center">
                        <Label Class="col-sm-3" For="username" HelpText="Your username. Note that this field can not be modified once it is saved." ResourceKey="Username"></Label>
                        <div class="col-sm-9">
                            <input id="username" class="form-control" @bind="@_username" maxlength="256" required />
                        </div>
                    </div>
                    <div class="row mb-1 align-items-center">
                        <Label Class="col-sm-3" For="password" HelpText="Please choose a sufficiently secure password and enter it here" ResourceKey="Password"></Label>
                        <div class="col-sm-9">
							<div class="input-group">
								<input id="password" type="@_passwordtype" class="form-control" @bind="@_password" autocomplete="new-password" required />
                                <button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
							</div>
                        </div>
                    </div>
                    <div class="row mb-1 align-items-center">
                        <Label Class="col-sm-3" For="confirm" HelpText="Enter your password again to confirm it matches the value entered above" ResourceKey="Confirm"></Label>
                        <div class="col-sm-9">
							<div class="input-group">
								<input id="confirm" type="@_passwordtype" class="form-control" @bind="@_confirm" autocomplete="new-password" required />
                                <button type="button" class="btn btn-secondary" @onclick="@TogglePassword" tabindex="-1">@_togglepassword</button>
							</div>
                        </div>
                    </div>
                    <div class="row mb-1 align-items-center">
                        <Label Class="col-sm-3" For="email" HelpText="Your email address where you wish to receive notifications" ResourceKey="Email"></Label>
                        <div class="col-sm-9">
							<input id="email" class="form-control" @bind="@_email" maxlength="256" required />
                        </div>
                    </div>
                    <div class="row mb-1 align-items-center">
                        <Label Class="col-sm-3" For="displayname" HelpText="Your full name" ResourceKey="DisplayName"></Label>
                        <div class="col-sm-9">
                            <input id="displayname" class="form-control" @bind="@_displayname" maxlength="50" />
                        </div>
                    </div>
                </div>
                <br />
                <button type="button" class="btn btn-primary" @onclick="Register">@Localizer["Register"]</button>
                <button type="button" class="btn btn-secondary" @onclick="Cancel">@SharedLocalizer["Cancel"]</button>
            </form>
        </NotAuthorized>
    </AuthorizeView>
}
else
{
    <ModuleMessage Message="@Localizer["Info.Registration.Disabled"]" Type="MessageType.Info" />
}

@code {
    private string _passwordrequirements;
    private string _username = string.Empty;
    private ElementReference form;
    private bool validated = false;
    private string _password = string.Empty;
    private string _passwordtype = "password";
    private string _togglepassword = string.Empty;
    private string _confirm = string.Empty;
    private string _email = string.Empty;
    private string _displayname = string.Empty;

    public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous;

    protected override async Task OnInitializedAsync()
    {
        _passwordrequirements = await UserService.GetPasswordRequirementsAsync(PageState.Site.SiteId);
    }

    protected override void OnParametersSet()
	{
		_togglepassword = SharedLocalizer["ShowPassword"];     
	}

    private async Task Register()
    {
        validated = true;
        var interop = new Interop(JSRuntime);
        if (await interop.FormValid(form))
        {
            try
            {
                bool _isEmailValid = Utilities.IsValidEmail(_email);

                if (_isEmailValid)
                {
                    if (_password == _confirm)
                    {
                        var user = new User
                        {
                            SiteId = PageState.Site.SiteId,
                            Username = _username,
                            Password = _password,
                            Email = _email,
                            DisplayName = (_displayname == string.Empty ? _username : _displayname),
							PhotoFileId = null
                        };
                        user = await UserService.AddUserAsync(user);

                        if (user != null)
                        {
                            await logger.LogInformation("User Created {Username} {Email}", _username, _email);
                            AddModuleMessage(Localizer["Info.User.AccountCreate"], MessageType.Info);
                        }
                        else
                        {
                            await logger.LogError("Error Adding User {Username} {Email}", _username, _email);
                            AddModuleMessage(Localizer["Error.User.AddInfo"], MessageType.Error);
                        }
                    }
                    else
                    {
                        AddModuleMessage(Localizer["Message.Password.NoMatch"], MessageType.Warning);
                    }
                }
                else
                {
                    AddModuleMessage(Localizer["Message.Required.UserInfo"], MessageType.Warning);
                }
            }
            catch (Exception ex)
            {
                await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", _username, _email, ex.Message);
                AddModuleMessage(Localizer["Error.User.Add"], MessageType.Error);
            }
        }
        else
        {
            AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning);
        }
    }

    private void Cancel()
    {
        NavigationManager.NavigateTo(NavigateUrl(string.Empty));
    }

    private void TogglePassword()
	{
		if (_passwordtype == "password")
		{
			_passwordtype = "text";
			_togglepassword = SharedLocalizer["HidePassword"];
		}
		else
		{
			_passwordtype = "password";
			_togglepassword = SharedLocalizer["ShowPassword"];
		}
	}
}
